package Client

import (
	"database/sql"
	_ "github.com/go-sql-driver/mysql"
	"log"
)

// User 定义一个结构体来接收到的数据
type User struct {
	id       int    // 序号
	username string //用户名
	passwd   string //密码
	email    string //邮件
}

// SelectDB 查询注册信息
//
//	返回id，用户名，密码，邮箱
func SelectDB(name string) (error, int, string, string, string) {
	//创建一个数据库连接
	//数据库登录用户名:密码@tcp(mysql主机ip:端口)/database名称
	db, err := sql.Open("mysql", "root:rootroot@tcp(139.186.140.92:3306)/User")
	if err != nil {
		//log.Fatal(err)
		return err, 0, "", "", ""
	}
	//调用ping方法
	err = db.Ping()
	if err != nil {
		//log.Fatal(err)
		return err, 0, "", "", ""
	}
	//实例化一个结构体来接收单行查询的结
	u := new(User)
	//使用sql预处理，减少重复sql的麻烦
	StringSQL := "select * from user.users where Username=?;"
	//创建预处理
	stmt, err := db.Prepare(StringSQL)
	if err != nil {
		//log.Fatal(err)
		return err, 0, "", "", ""
	}
	//使用预处理的语句执行查询
	err = stmt.QueryRow(name).Scan(&u.id, &u.username, &u.passwd, &u.email)
	if err != nil {
		//log.Fatal(err)
		return err, 0, "", "", ""
	}
	//err = db.QueryRow().Scan(&u.id, &u.username, &u.passwd, &u.email)
	//fmt.Printf("id：%d\t用户名：%s\t密码：%s\t邮箱：%s\n", u.id, u.username, u.passwd, u.email)
	return err, u.id, u.username, u.passwd, u.email
}

// AddDB 实现注册，往数据库里加数据
func AddDB(name string, pass string, email string) bool {
	//数据库登录用户名:密码@tcp(mysql主机ip:端口)/database名称
	db, err := sql.Open("mysql", "yemur:root@tcp(139.186.140.92:3306)/User")
	if err != nil {
		//log.Fatal(err)
		return false
	}
	//调用ping方法
	err = db.Ping()
	if err != nil {
		//log.Fatal(err)
		return false
	}
	//实例化一个结构体来接收单行查询的结
	u := new(User)
	u.username = name //用户名对齐
	u.passwd = pass
	u.email = email

	//使用sql预处理，减少重复sql的麻烦
	StringSQL := "insert into users(Username, Passwd, Email) VALUE (?,?,?);"
	//创建预处理
	stmt, err := db.Prepare(StringSQL)
	if err != nil {
		//log.Fatal(err)
		return false
	}
	//使用预处理的语句执行添加
	_, err = stmt.Exec(name, pass, email)
	if err != nil {
		//log.Fatal(err)
		return false
	}

	return true
	/*err = stmt.QueryRow(name).Scan(&u.id, &u.username, &u.passwd, &u.email)
	if err != nil {
		//log.Fatal(err)
		return false
	}*/
}

// RestPasswd 重置密码
//
//	前置步骤：使用邮箱进行验证(下版本实现)
//	参数：用户名、新密码(暂时不支持验证这一步)
func RestPasswd(nam string, pass string) bool {
	//发送一条邮箱验证(下版本实现)

	//验证通过
	//执行用户数据更新操作
	db, err := sql.Open("mysql", "yemur:root@tcp(139.186.140.92:3306)/User")
	if err != nil {
		//log.Fatal(err)
		return false
	}
	//调用ping方法
	err = db.Ping()
	if err != nil {
		//log.Fatal(err)
		return false
	}
	StrSQL := "update users set Passwd=? where Username=?;"
	stmt, err := db.Prepare(StrSQL)
	if err != nil {
		return false
	}
	_, err = stmt.Exec(pass, nam)
	if err != nil {
		return false
	}
	return true
}

// SelectLogin 创建一个协程来处理登陆注册的逻辑
//
//	参数：用户名、密码
func SelectLogin(username string, passwd string) bool {
	err, _, SelectName, SelectPasswd, _ := SelectDB(username)
	if err != nil {
		return false
	}
	if username != SelectName {
		return false //用户名未注册
	} else if username == SelectName {
		if SelectPasswd == passwd {
			return true //用户名、密码均正确，返回，让客户端成功登陆
		} else {
			return false //用户名正确，但是密码错误
		}
	}
	return true
}

// Register 实现注册功能
//
//	参数：用户名、密码、邮箱
func Register(username string, passwd string, email string) bool {
	//查询是否注册(用户名与邮箱唯一)，如果注册返回false，如果没有注册，则执行注册并返回true
	err, _, SelectName, _, SelectEmail := SelectDB(username)
	if err != nil {
		log.Fatal(err)
		return false
	}
	if username != SelectName { //用户名未注册
		if email != SelectEmail { //邮箱未注册
			AddDB(username, passwd, email)
			return true
		}
		return false
	}
	return false
}

// RestPass 重置密码
//
//	用户名、密码
func RestPass(name string, pass string) bool {
	return RestPasswd(name, pass)
}
